<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // Generator 函数通过 yield 可以暂停执行，等待异步操作完成后再继续执行。
    // 这种方式与 async/await 类似，但更低级和复杂。

    function fetchData1() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(1);
                }, 2000);
            });
       }
       function fetchData2() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(2);
                }, 2000);
            });
       }

    function* fetchDataSync() {
        const result1 = yield fetchData1();  // 等待异步操作完成
        console.log('result1', result1)
        const result2 = yield fetchData2();  // 等待异步操作完成
        console.log('result2', result2)
        return result1 + result2
    }


    function co(it) {
        return new Promise((resolve, reject) => {
            function next(data) {
                let { value, done } = it.next(data)
                if (!done) {
                    Promise.resolve(value).then(data => {
                        next(data)
                    }).catch(reject)
                } else {
                    resolve(value)
                }
            }
            next()
        })
    }
    co(fetchDataSync()).then(res => {
        console.log(res)
    })
    // Generator 函数用 yield 暂停执行，等待异步操作的结果。
    // 通过 run() 函数，我们将异步操作的结果传递回 Generator 函数，并确保异步操作按顺序执行。
    // 缺点：比 async/await 更复杂，通常不推荐用于现代代码。
</script>
</html>